package entity

import (
	"shop/utils/convertutil"
)

const (
	TableNameGoods         = "goods"
	TableNameGoodsCategory = "goods_category"
	TableNameOrderInfo     = "order_info"
	TableNameShop          = "shop"
	TableNameUser          = "user"
)

type User struct {
	Id       int64  `json:"id"`
	ShopId   int    `json:"shopId"`
	Username string `json:"username" gorm:"column:username"` // 用户名，微信的openid
	Phone    string `json:"phone"`
	Name     string `json:"name"`
	Address  string `json:"address"`
	Sex      byte   `json:"sex"`
	Avatar   string `json:"avatar" gorm:"column:avatar"` // 用户头像
	Status   int    `json:"status"`                      // 账号状态，1：正常，2：冻结，3：禁用
}

func (User) TableName() string {
	return TableNameUser
}

type GoodsCategory struct {
	Id           int    `json:"id" gorm:"primary_key"`
	ShopId       int    `json:"shopId" gorm:"column:shop_id"`
	Name         string `json:"name" gorm:"column:name"`
	DisplayOrder int    `json:"displayOrder" gorm:"column:display_order"`
	ShowStatus   bool   `json:"showStatus" gorm:"column:show_status"` // 是否显示

	GoodsList []*Goods `json:"goodsList" gorm:"-"`
}

func (GoodsCategory) TableName() string {
	return TableNameGoodsCategory
}

type Goods struct {
	Id              int64  `json:"id" gorm:"primary_key"`
	ShopId          int    `json:"shopId" gorm:"column:shop_id"`
	GoodsCategoryId int    `json:"goodsCategoryId" gorm:"column:goods_category_id"`
	Name            string `json:"name" gorm:"name"`
	DisplayOrder    int    `json:"displayOrder" gorm:"column:display_order"`
	Price           int    `json:"price" gorm:"column:price"`   // 商品价格，没有主属性的时候该字段生效
	Count           int    `json:"count" gorm:"column:count"`   // 商品库存，没有主属性的时候该字段生效
	Status          int    `json:"status" gorm:"column:status"` // 商品状态，1：在售，2：已售空，3：已失效
	Image           string `json:"image" gorm:"image"`
	PropertyListStr string `json:"-" gorm:"column:property_list"`
	Description     string `json:"description" gorm:"description"`

	GoodsCategoryName string           `json:"goodsCategoryName" gorm:"-"`
	PropertyList      []*GoodsProperty `json:"propertyList" gorm:"-"`
}

func (Goods) TableName() string {
	return TableNameGoods
}

// PropertyListToStr 序列化属性列表
func (goods *Goods) PropertyListToStr() {
	if goods.PropertyList == nil {
		goods.PropertyList = make([]*GoodsProperty, 0, 0)
	}
	goods.PropertyListStr = convertutil.ToJsonString(goods.PropertyList)
}

// ParsePropertyList 反序列化属性列表
func (goods *Goods) ParsePropertyList() {
	goods.PropertyList = make([]*GoodsProperty, 0, 0)
	convertutil.ParseJson(goods.PropertyListStr, &goods.PropertyList)
}

// OrderInfo 订单信息
type OrderInfo struct {
	OrderNo            string `json:"orderNo" gorm:"column:order_no;primary_key"`
	UserId             int64  `json:"userId"`
	ShopId             int    `json:"shopId"` // 商家id
	OrderStatus        int8   `json:"orderStatus"`
	WxPayTransactionId string `json:"wxPayTransactionId"` // 微信订单交易号
	TakeType           int8   `json:"takeType"`           // 取餐方式
	AddressDetail      string `json:"addressDetail"`
	GoodsListStr       string `json:"-" gorm:"column:goods_list"` // 订单商品列表，OrderGoodsList序列化
	TotalPrice         int64  `json:"totalPrice"`                 // 总价格，分
	PayPrice           int64  `json:"payPrice"`                   // 实际支付
	RefundCount        int    `json:"refundCount"`                // 退款商品条数，全部商品都退款时订单状态变为退款状态
	ExtraInfo          string `json:"extraInfo"`                  // 用户备注
	CreateTime         int64  `json:"createTime"`
	PayTime            int64  `json:"payTime"` // 支付时间
	FinishTime         int64  `json:"finishTime"`
	UserPhone          string `json:"userPhone"` // 用户联系电话
	Receiver           string `json:"receiver"`  // 取餐人

	GoodsList []*OrderGoods `json:"goodsList" gorm:"-"`
}

func (OrderInfo) TableName() string {
	return TableNameOrderInfo
}

// GoodsListToStr 序列化订单商品列表
func (order *OrderInfo) GoodsListToStr() {
	if order.GoodsList == nil {
		order.GoodsList = make([]*OrderGoods, 0, 0)
	}
	order.GoodsListStr = convertutil.ToJsonString(order.GoodsList)
}

// ParseGoodsList 反序列化订单商品列表
func (order *OrderInfo) ParseGoodsList() {
	order.GoodsList = make([]*OrderGoods, 0, 0)
	convertutil.ParseJson(order.GoodsListStr, &order.GoodsList)
}

type Shop struct {
	Id                int    `json:"id" gorm:"column:id;primary_key"`
	WxPayMchId        string `json:"wxPayMchId" gorm:"column:wx_pay_mch_id"`            // 微信支付商家号
	WxPayApiKey       string `json:"wxPayApiKey" gorm:"column:wx_pay_api_key"`          // 微信支付apiKey
	WxGzhAppId        string `json:"wxGzhAppId" gorm:"column:wx_gzh_app_id"`            // 微信公众号的appId
	WxGzhAppSecret    string `json:"wxGzhAppSecret" gorm:"column:wx_gzh_app_secret"`    // 微信公众号的appSecret
	WxMpAppId         string `json:"wxMpAppId" gorm:"wx_mp_app_id"`                     // 微信小程序的appId
	WxMpAppSecret     string `json:"wxMpAppSecret" gorm:"wx_map_app_secret"`            // 微信小程序的appSecret
	CertPEMPublicKey  string `json:"certPEMPublicKey" gorm:"column:certpem_public_key"` // 微信支付的tls-p12证书-PEM格式的公钥,微信退款等需要
	CertPEMPrivateKey string `json:"certPEMPrivateKey" gorm:"column:certpem_private_key"`
	MerchantName      string `json:"merchantName" gorm:"column:merchant_name" `         // 商家姓名
	Name              string `json:"name" gorm:"column:name"`                           // 店铺名称
	PackingPrice      int    `json:"packingPrice" gorm:"column:packing_price"`          // 包装费（单位: 分）
	SendingPrice      int    `json:"sendingPrice" gorm:"column:sending_price"`          // 配送费（单位: 分）
	SendingNeedPrice  int    `json:"sendingNeedPrice" gorm:"column:seeding_need_price"` // 起送需要的最低价格（单位: 分）
	StartTime         string `json:"startTime" gorm:"column:start_time"`                // 营业开始时间, eg:09:30
	EndTime           string `json:"endTime" gorm:"column:end_time"`                    // 营业结束时间
	RelationPhones    string `json:"relationPhones" gorm:"column:relation_phones"`      // 联系电话, 逗号隔开
	RelationQQ        string `json:"relationQQ" gorm:"column:relation_qq"`              // 联系QQ
	RelationWeixin    string `json:"relationWeixin" gorm:"column:relation_weixin"`      // 联系微信
	Status            int    `json:"status" gorm:"column:status"`                       // 店铺状态, 营业中|休息中|已关闭
	Notice            string `json:"notice" gorm:"column:notice"`                       // 店铺公告
	Address           string `json:"address" gorm:"column:address"`                     // 店铺地址
	Description       string `json:"description" gorm:"column:description"`             //
	PrinterId         string `json:"printerId" gorm:"column:printer_id"`                // 打印机编号
	CreateTime        int64  `json:"createTime" gorm:"column:create_time"`
}

func (Shop) TableName() string {
	return TableNameShop
}
